ExcelVBAPartsCollection Home Excel Reference Manual DownLoad My Profile
Menu Back Next Links Excel Function Manual Myself My BBS


エラー処理

 





エラー処理の概要

 実行時エラーが発生すると、通常はその時点でプロシージャの処理が止まってしまいます。VBAでは、実行時エラーが発生したときに、それを適切に処理するためのプログラムを入れることができるようになっています。これをエラートラップ(Error Trap)と呼び、下記の 2 つの方法があります。

1 エラー発生時の動作指定

ステートメント 動               作
On Error Resume Next 実行時エラーが発生してもプログラムを中断せず、エラーが発生した箇所の次の処理から継続して実行します。
通常、エラーの発生が予想されるところのすぐ後ろにエラー処理を記述しておく方法です。
On Error GoTo <line> On Errorステートメントと同じプロシージャ内に存在する引数 line で指定した行(任意の行ラベルまたは行番号)から始まるエラー処理ルーチンを実行します。
エラーが発生したときのジャンプ先を予め決めておき、エラー処理を一括して行う方法です。
エラーの発生時以外にエラー処理ルーチンが実行されないようにするには、そのエラー処理ルーチンの直前に Exit Sub (ファンクション・プロシージャの場合は、Exit Function)ステートメントを配置してプロシージャを終了します。
<line>に 0 を指定するとエラートラップを無効にします。
どちらもプロシージャの先頭にステートメントを記述しておきます。

2 エラー処理ルーチンからの戻り先の指定
 
ステートメント 動               作
Resume エラーの原因となった行からプログラムの実行が再開されます。
Resume Next  エラーの原因となった行の次からプログラムの実行が再開されます。
Resume <line>  引数 line に指定した行(行ラベルまたは行番号)からプログラムの実行が再開されます。
エラー処理実行後の戻り先は、エラー処理ルーチンの最後に指定し、戻り先の位置(行)はエラー処理ルーチンと同じプロシージャ内にある必要があります。

3 エラーの内容を調べる

 エラーが発生したときに、その内容を調べるには、「Error」関数と「Err」オブジェクトがあります。

(1)  Error 関数
 指定したエラー番号に対応するエラー メッセージを返します。
 
 [ Error 関数の構文 ]
   Error(エラー番号)
 [ 例1:エラー番号をに対応するエラーメッセージをメッセージボックスに表示 ]
     MsgBox Error(11)  ' 「0 で除算しました」を表示

(2)  Err オブジェクト
 エラー内容の情報をプロパティで参照します。プロパティの種類と内容は下表のとおりです。
 
 [ Err オブジェクトの構文 ]
   Err.<プロパティ>  
 [ 例1:エラー内容をメッセージボックスに表示 ]
     On Error Resume Next
     Error 11   'エラーステートメントで「 0 除算エラー」を発生させる 
     MsgBox "エラー内容:" & Err.Description  ' 「エラー内容:0 で除算しました」を表示

Err オブジェクトに使用するプロパティと参照内容

プロパティ 参     照     内     容
Description エラーの説明の文字列を設定します。値の取得も可能です。
Number エラー番号を設定します。Err オブジェクトの既定プロパティです。値の取得も可能です。
HelpContext ヘルプファイルのトピックに対応するコンテキスト番号を含む文字列式を設定します。値の取得も可能です。
HelpFile ヘルプファイルへの絶対バスを含む文字列式を設定します。値の取得も可能です。
Source エラーの発生元のオブジェクトまたはアプリケーションの名前を示す文字列式を設定します。値の取得も可能です。
LastDLLError 最後にダイナミック リンク ライブラリ (DLL) を呼び出したときのエラーコードを返します。値の取得のみ可能です。





On Error Resume Next

エラー行の次から継続して実行

処理内容:エラー発生行の次の行から処理を継続します
Sub error_1()
On Error Resume Next
' <通常の処理>
Error 11   '「 0 除算エラー」を発生させる
If Err.Number = 11 Then
MsgBox "エラーが発生したときの処理"
Err.Clear  ' エラーメッセージのリセット
End If
' <通常の処理>
End Sub


処理内容:エラーが発生しても無視して次の行を実行します
Sub error_2()
On Error Resume Next
Sheets("Sheet1").Select
ActiveWorkbook.Value = 100  'エラーを発生させる
MsgBox "エラーの次の行です。"
Err.Clear  ' エラーメッセージのリセット
End Sub





On Error GoTo

2 エラートラップを指定してエラー処理

処理内容:エラー番号とエラー内容を表示します
Sub error_3()
On Error GoTo ErrorTrap
Ans = 100 / 0   '「 0 除算エラー」を発生させる
MsgBox "エラーの次の行です。"
Exit Sub   ' プロシージャを抜け出る。
ErrorTrap:
MsgBox "エラー番号:" & Err.Number & vbCrLf & _
"エラー内容: " & Err.Description
Resume Next  ' エラー発生行の次から実行
End Sub


処理内容:エラートラップを指定(エラー発生行から再実行)します
Sub error_4()
On Error GoTo ErrorTrap
Msg = "2 桁の数値を入力してください。"& vbCrLf & _
"0 を入力するとエラーが発生します"
A = 100 / Application.InputBox(Prompt:=Msg, Title:="エラー処理", Type:=1)
MsgBox "答えは " & Num & " です。"
Exit Sub    ' プロシージャを抜け出る。
ErrorTrap:
MsgBox "エラー内容:" & Err.Description & vbCrLf & _
"1から99までの数値を入力してください。"
Resume  ' エラー発生行から実行
End Sub


処理内容:エラートラップを指定(指定行またはラベルから再実行)します
Sub error_5()
On Error GoTo ErrorTrap
ErrFlag = 0
Retry:  ' エラー時にここから再度実行
If ErrFlag = 0 Then
N = Val(InputBox("100を任意の数値で除算します。" & _
vbCrLf & "0 (ゼロ)を入力するとエラーが発生します。"))
Else
N = Val(InputBox("1から99までの数値を入力してください。"))
End If
Ans = Int(100 / N)  '入力結果が0のとき「ErrorTrap:」へ
MsgBox "100を" & N & "で除算した結果= " & Int(Ans)
Exit Sub    ' プロシージャを抜け出る。
ErrorTrap:
MsgBox "エラールーチンの中です。再実行します。"
ErrFlag = 1
Resume Retry  ' ラベル「Retry:」へジャンプする。
End Sub





テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル